home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / src / timeout.c < prev    next >
C/C++ Source or Header  |  1993-01-24  |  12KB  |  468 lines

  1. /*    SCCS Id: @(#)timeout.c    3.1    92/11/01    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include    "hack.h"
  6.  
  7. STATIC_DCL void NDECL(stoned_dialogue);
  8. STATIC_DCL void NDECL(vomiting_dialogue);
  9. STATIC_DCL void NDECL(choke_dialogue);
  10. STATIC_DCL void FDECL(hatch_it, (struct obj *));
  11.  
  12. static void FDECL(age_candle, (struct obj *));
  13.  
  14. #ifdef OVLB
  15.  
  16. /* He is being petrified - dialogue by inmet!tower */
  17. static const char NEARDATA *stoned_texts[] = {
  18.     "You are slowing down.",        /* 5 */
  19.     "Your limbs are stiffening.",        /* 4 */
  20.     "Your limbs have turned to stone.",    /* 3 */
  21.     "You have turned to stone.",        /* 2 */
  22.     "You are a statue."            /* 1 */
  23. };
  24.  
  25. STATIC_OVL void
  26. stoned_dialogue() {
  27.     register long i = (Stoned & TIMEOUT);
  28.  
  29.     if(i > 0 && i <= SIZE(stoned_texts))
  30.         pline(stoned_texts[SIZE(stoned_texts) - i]);
  31.     if(i == 5)
  32.         Fast &= ~(TIMEOUT|INTRINSIC);
  33.     if(i == 3)
  34.         nomul(-3);
  35.     exercise(A_DEX, FALSE);
  36. }
  37.  
  38. /* He is getting sicker and sicker prior to vomiting */
  39. static const char NEARDATA *vomiting_texts[] = {
  40.     "You are feeling mildly nauseous.",    /* 14 */
  41.     "You feel slightly confused.",        /* 11 */
  42.     "You can't seem to think straight.",    /* 8 */
  43.     "You feel incredibly sick.",        /* 5 */
  44.     "You suddenly vomit!"            /* 2 */
  45. };
  46.  
  47. STATIC_OVL void
  48. vomiting_dialogue() {
  49.     register long i = (Vomiting & TIMEOUT) / 3L;
  50.  
  51.     if ((((Vomiting & TIMEOUT) % 3L) == 2) && (i >= 0)
  52.         && (i < SIZE(vomiting_texts)))
  53.         pline(vomiting_texts[SIZE(vomiting_texts) - i - 1]);
  54.  
  55.     switch ((int) i) {
  56.     case 0:
  57.         vomit();
  58.         morehungry(20);
  59.         break;
  60.     case 2:
  61.         make_stunned(HStun + d(2,4), FALSE);
  62.         /* fall through */
  63.     case 3:
  64.         make_confused(HConfusion + d(2,4), FALSE);
  65.         break;
  66.     }
  67.     exercise(A_CON, FALSE);
  68. }
  69.  
  70. static const char NEARDATA *choke_texts[] = {
  71.     "You find it hard to breathe.",
  72.     "You're gasping for air.",
  73.     "You can no longer breathe.",
  74.     "You're turning %s.",
  75.     "You suffocate."
  76. };
  77.  
  78. STATIC_OVL void
  79. choke_dialogue()
  80. {
  81.     register long i = (Strangled & TIMEOUT);
  82.  
  83.     if(i > 0 && i <= SIZE(choke_texts))
  84.         pline(choke_texts[SIZE(choke_texts) - i], Hallucination ?
  85.             hcolor() : blue);
  86.     exercise(A_STR, FALSE);
  87. }
  88.  
  89. #endif /* OVLB */
  90. #ifdef OVL0
  91.  
  92. void
  93. nh_timeout()
  94. {
  95.     register struct prop *upp;
  96.     int sleeptime;
  97.  
  98.     if(u.uluck && moves % (u.uhave.amulet || u.ugangr ? 300 : 600) == 0) {
  99.     /* Cursed luckstones stop bad luck from timing out; blessed luckstones
  100.      * stop good luck from timing out; normal luckstones stop both;
  101.      * neither is stopped if you don't have a luckstone.
  102.      * Luck is based at 0 usually, +1 if a full moon and -1 on Friday 13th
  103.      */
  104.         register int time_luck = stone_luck(FALSE);
  105.         boolean nostone = !carrying(LUCKSTONE) && !stone_luck(TRUE);
  106.         int baseluck = (flags.moonphase == FULL_MOON) ? 1 : 0;
  107.  
  108.         baseluck -= (flags.friday13 ? 1 : 0);
  109.  
  110.         if(u.uluck > baseluck && (nostone || time_luck < 0))
  111.         u.uluck--;
  112.         else if(u.uluck < baseluck && (nostone || time_luck > 0))
  113.         u.uluck++;
  114.     }
  115.     if(u.uinvulnerable) return; /* things past this point could kill you */
  116.     if(Stoned) stoned_dialogue();
  117.     if(Vomiting) vomiting_dialogue();
  118.     if(Strangled) choke_dialogue();
  119. #ifdef POLYSELF
  120.     if(u.mtimedone) if(!--u.mtimedone) rehumanize();
  121. #endif
  122.     if(u.ucreamed) u.ucreamed--;
  123.  
  124.     for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++)
  125.         if((upp->p_flgs & TIMEOUT) && !(--upp->p_flgs & TIMEOUT)) {
  126.         if(upp->p_tofn) (*upp->p_tofn)();
  127.         else switch(upp - u.uprops){
  128.         case STONED:
  129.             if (!killer) {
  130.                 killer_format = KILLED_BY_AN;
  131.                 killer = "cockatrice";
  132.             } done(STONING);
  133.             break;
  134.         case VOMITING:
  135.             make_vomiting(0L, TRUE);
  136.             break;
  137.         case SICK:
  138.             You("die from your illness.");
  139.             killer_format = KILLED_BY_AN;
  140.             killer = u.usick_cause;
  141.             done(POISONING);
  142.             break;
  143.         case FAST:
  144.             if (Fast & ~INTRINSIC) /* boot speed */
  145.                 ;
  146.             else
  147.                 You("feel yourself slowing down%s.",
  148.                             Fast ? " a bit" : "");
  149.             break;
  150.         case CONFUSION:
  151.             HConfusion = 1; /* So make_confused works properly */
  152.             make_confused(0L, TRUE);
  153.             stop_occupation();
  154.             break;
  155.         case STUNNED:
  156.             HStun = 1;
  157.             make_stunned(0L, TRUE);
  158.             stop_occupation();
  159.             break;
  160.         case BLINDED:
  161.             Blinded = 1;
  162.             make_blinded(0L, TRUE);
  163.             stop_occupation();
  164.             break;
  165.         case INVIS:
  166.             newsym(u.ux,u.uy);
  167.             if (!Invis && !See_invisible && !Blind)
  168.                 You("are no longer invisible.");
  169.             stop_occupation();
  170.             break;
  171.         case SEE_INVIS:
  172.             set_mimic_blocking(); /* do special mimic handling */
  173.             see_monsters();        /* make invis mons appear */
  174.             newsym(u.ux,u.uy);    /* make self appear */
  175.             stop_occupation();
  176.             break;
  177.         case WOUNDED_LEGS:
  178.             heal_legs();
  179.             stop_occupation();
  180.             break;
  181.         case HALLUC:
  182.             HHallucination = 1;
  183.             make_hallucinated(0L, TRUE, 0L);
  184.             stop_occupation();
  185.             break;
  186.         case SLEEPING:
  187.             if (unconscious() || Sleep_resistance)
  188.                 Sleeping += rnd(100);
  189.             else {
  190.                 You("fall asleep.");
  191.                 sleeptime = rnd(20);
  192.                 nomul(-sleeptime);
  193.                 u.usleep = 1;
  194.                 nomovemsg = "You wake up.";
  195.                 Sleeping = sleeptime + rnd(100);
  196.             }
  197.             break;
  198.         case STRANGLED:
  199.             killer_format = KILLED_BY;
  200.             killer = "strangulation";
  201.             done(DIED);
  202.             break;
  203.         case FUMBLING:
  204.             /* call this only when a move took place.  */
  205.             /* otherwise handle fumbling msgs locally. */
  206.             if (!Levitation && u.umoved) {
  207.                 if (OBJ_AT(u.ux, u.uy))
  208.                 You("trip over something.");
  209.                 else if (rn2(3) && is_ice(u.ux, u.uy))
  210.                 You("%s on the ice.",
  211.                     rn2(2) ? "slip" : "slide");
  212.                 else
  213.                 switch (rn2(4)) {
  214.                     case 1:
  215.                     if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  216.                         if (Hallucination) pline("A rock bites your foot.");
  217.                         else You("trip over a rock.");
  218.                         break;
  219.                     }
  220.                     case 2:
  221.                     if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  222.                         if (Hallucination) You("slip on a banana peel.");
  223.                         else You("slip and nearly fall.");
  224.                         break;
  225.                     }
  226.                     case 3:
  227.                     You("flounder.");
  228.                     break;
  229.                     default:
  230.                     You("stumble.");
  231.                 }
  232.                 nomul(-2);
  233.                 nomovemsg = "";
  234.                 /* Fumbling can be noisy */
  235.                 if ((inv_weight() > -500)) {
  236.                     You("make a lot of noise!");
  237.                     wake_nearby();
  238.                 }
  239.             }
  240.             Fumbling += rnd(20);
  241.             break;
  242.         }
  243.     }
  244. }
  245.  
  246. #endif /* OVL0 */
  247. #ifdef OVLB
  248.  
  249. STATIC_OVL void
  250. hatch_it(otmp)        /* hatch the egg "otmp" if possible */
  251. register struct obj *otmp;
  252. {
  253.     register struct monst *mtmp;
  254. #ifdef POLYSELF
  255.     int yours = otmp->spe;
  256. #endif
  257.  
  258.     if(monstermoves-otmp->age > 200)  /* very old egg - it's dead */
  259.         otmp->corpsenm = -1;
  260. #ifdef LINT    /* long conv. ok */
  261.     else if(rnd(150) > 150) {
  262. #else
  263.     else if(rnd((int)(monstermoves-otmp->age)) > 150) {
  264. #endif
  265.         mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy);
  266.         useup(otmp);
  267.         if(mtmp) {
  268.  
  269.         if(Blind)
  270.             You("feel something %s from your pack!",
  271.             locomotion(mtmp->data, "drop"));
  272.         else
  273.             You("see %s %s out of your pack!",
  274.             an(mtmp->data->mname),
  275.             locomotion(mtmp->data, "drop"));
  276.  
  277. #ifdef POLYSELF
  278.         if (yours) {
  279.             struct monst *mtmp2;
  280.  
  281.             pline("Its cries sound like \"%s.\"",
  282.             flags.female ? "mommy" : "daddy");
  283.             if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  284.             mtmp = mtmp2;
  285.             mtmp->mtame = 20;
  286.             while(otmp = (mtmp->minvent)) {
  287.             mtmp->minvent = otmp->nobj;
  288.             dealloc_obj(otmp);
  289.             }
  290.             return;
  291.         }
  292. #endif
  293.         if(mtmp->data->mlet == S_DRAGON) {
  294.             struct monst *mtmp2;
  295.  
  296.             verbalize("Gleep!");        /* Mything eggs :-) */
  297.             if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  298.             mtmp = mtmp2;
  299.             while(otmp = (mtmp->minvent)) {
  300.             mtmp->minvent = otmp->nobj;
  301.             dealloc_obj(otmp);
  302.             }
  303.         }
  304.         }
  305.     }
  306. }
  307.  
  308. #endif /* OVLB */
  309. #ifdef OVL1
  310.  
  311. void
  312. hatch_eggs()        /* hatch any eggs that have been too long in pack */
  313. {
  314.     register struct obj *otmp, *otmp2;
  315.  
  316.     for(otmp = invent; otmp; otmp = otmp2) {
  317.         otmp2 = otmp->nobj;        /* otmp may hatch */
  318.         if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);
  319.         /* else if (Is_container(otmp) && otmp->cobj) ...        */
  320.         /*                                */
  321.         /* Check for container here and hatch with the container.    */
  322.         /* One of these days...                    */
  323.         /* Maybe call hatch_eggs() with invent as a parameter so    */
  324.         /* that we can call it recursively.                */
  325.     }
  326. }
  327.  
  328. /* Burn up lit lamps.  Only applies to non-magic lamps; magic lamps stay
  329.  * lit as long as there's a genie inside.  We use obj->age to see how long
  330.  * there is left for the lamp to burn, but this differs from the use of
  331.  * age for corpses and eggs: for the latter items it's when the object was
  332.  * created, but for lamps it's the number of moves remaining.
  333.  */
  334. void
  335. burn_lamps()
  336. {
  337.     register struct obj *obj;
  338.  
  339.     /* Note: magic lamps never go out as long as the genie's inside */
  340.     for(obj=invent; obj; obj=obj->nobj) {
  341.         if ((obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN)
  342.                             && obj->lamplit) {
  343.         obj->age--;
  344.         switch((int)obj->age) {
  345.             case 150:
  346.             case 100:
  347.             if (obj->otyp == BRASS_LANTERN) goto advmsg;
  348.             if (!Blind)
  349.                 Your("%s flickers.", xname(obj));
  350.             break;
  351.             case 50:
  352.             if (obj->otyp == BRASS_LANTERN) goto advmsg;
  353.             if (!Blind)
  354.                 Your("%s flickers considerably.", xname(obj));
  355.             break;
  356.             case 25:
  357.     advmsg:        if (!Blind) {
  358.                 if (obj->otyp == BRASS_LANTERN) {
  359.                 Your("lamp is getting dim.");
  360.                 if (Hallucination)
  361.                     pline("Batteries have not been invented yet.");
  362.                 } else
  363.                 Your("%s seems about to go out.", xname(obj));
  364.             }
  365.             break;
  366.             case 0: /* even if blind you'll know */
  367.             if (obj->otyp == BRASS_LANTERN)
  368.                 Your("lamp has run out of power.");
  369.             else Your("%s goes out.", xname(obj));
  370.             obj->lamplit = 0;
  371.             obj->spe = 0;
  372.             check_lamps();
  373.             break;
  374.             default: break;
  375.         }
  376.         }
  377.         if ((obj->otyp == CANDELABRUM_OF_INVOCATION || Is_candle(obj)) &&
  378.             obj->lamplit)
  379.         age_candle(obj);
  380.     }
  381. }
  382.  
  383. static void
  384. age_candle(otmp)
  385. register struct obj *otmp;
  386. {
  387.     register boolean many, 
  388.                      menorah = otmp->otyp == CANDELABRUM_OF_INVOCATION;
  389.  
  390.     otmp->age--;
  391.  
  392.     if (otmp->age == 0L) {
  393.         otmp->lamplit = 0;
  394.         many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  395.         if (menorah) {
  396.         pline("%s's flame%s.", 
  397.             The(xname(otmp)), (many ? "s die" : " dies"));
  398.         otmp->spe = 0;
  399.         } else {
  400.         Your("%s %s consumed!  %s",
  401.             xname(otmp), (many ? "are" : "is"),
  402.             (Hallucination ?
  403.                 (many ? "They shriek!" : "It shrieks!") :
  404.              Blind ? "" :
  405.                 (many ? "Their flames die." : "Its flame dies.")));
  406.         freeinv(otmp);
  407.         obfree(otmp, (struct obj *)0);
  408.         }
  409.         check_lamps();
  410.     } else if (Blind) {
  411.         return;
  412.     } else if (otmp->age == 15L) {
  413.         many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  414.         Norep("The %scandle%s flame%s flicker%s low!",
  415.             (menorah ? "candelabrum's " : ""),
  416.             (many ? "s'" : "'s"),
  417.             (many ? "s" : ""),
  418.             (many ? "" : "s"));
  419.     } else if (otmp->age == 75L) {
  420.         many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  421.         Norep("The %scandle%s getting short.",
  422.             menorah ? "candelabrum's " : "",
  423.             (many ? "s are" : " is"));
  424.     }
  425. }
  426. void
  427. do_storms()
  428. {
  429.     int nstrike;
  430.     register int x, y;
  431.     int dirx, diry;
  432.     int count;
  433.  
  434.     /* no lightning if not the air level or too often, even then */
  435.     if(!Is_airlevel(&u.uz) || rn2(8))
  436.     return;
  437.  
  438.     /* the number of strikes is 8-log2(nstrike) */
  439.     for(nstrike = rnd(64); nstrike <= 64; nstrike *= 2) {
  440.     count = 0;
  441.     do {
  442.         x = rnd(COLNO-1);
  443.         y = rn2(ROWNO);
  444.     } while (++count < 100 && levl[x][y].typ != CLOUD);
  445.  
  446.     if(count < 100) {
  447.         dirx = rn2(3) - 1;
  448.         diry = rn2(3) - 1;
  449.         if(dirx != 0 || diry != 0)
  450.         buzz(-15, /* "monster" LIGHTNING spell */
  451.              8, x, y, dirx, diry);
  452.     }
  453.     }
  454.  
  455.     if(levl[u.ux][u.uy].typ == CLOUD) {
  456.     /* inside a cloud during a thunder storm is deafening */
  457.     pline("Kaboom!!!  Boom!!  Boom!!");
  458.     if(!u.uinvulnerable) {
  459.         stop_occupation();
  460.         nomul(-3);
  461.     }
  462.     } else
  463.     You("hear a rumbling noise.");
  464. }
  465. #endif /* OVL1 */
  466.  
  467. /*timeout.c*/
  468.